package service;

// 通过这个类来描述整个程序的核心业务逻辑

import dao.FileDao;
import entity.FileMeta;
import manager.FileManager;

import java.io.File;
import java.util.List;

public class SearchService {
    private FileDao fileDao = new FileDao();  // 创建对象可以实现对数据库的相关操作
    private FileManager fileManager = new FileManager();  // 创建对象可以进行扫描文件
    // 使用这个线程来周期性的扫描文件系统
    private Thread t = null;

    // 1. 提供初始化操作
    public void init(String basePath) {
        // 初始情况下，就把数据库初始化好，并且进行一个初始的扫描工作
        fileDao.initDB(); // 初始化数据库
        // 把这个操作挪到 扫描线程 中完成，不再界面主线程中执行了
//        fileManager.scanAll(new File(basePath)); // 进行扫描工作

        // 一个单独的线程，这个线程周期性的扫描当前设定的路径，可以在用户更新了文件系统的内容之后扫描到
        t = new Thread(() -> {
            while (!t.isInterrupted()) {  // isInterrupted()检测是否中断
                fileManager.scanAll(new File(basePath)); // 进行扫描工作，先扫描一次，再 sleep
                try {
                    Thread.sleep(20000);  // 20s 扫描一次
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break;  // 出现异常情况下直接结束循环
                }
            }
        });
        t.start(); // 启动线程
        System.out.println("[SearchService] 初始化完成！");
    }

    // 使用这个方法，让扫描线程停止下来
    public void shutdown() {
        if(t == null) {
            t.interrupt();  // 停止 线程 t
        }
    }

    // 2. 提供一个查找方法（根据关键字查找）
    public List<FileMeta> search(String pattern) {
        return fileDao.searchByPattern(pattern);
    }

    // 3. 根据路径查找
    public List<FileMeta> searchPath(String path) {
        return fileDao.searchByPath(path);
    }

}
